sha算法
SHA是一类由美国国家标准与技术研究院(NIST)发布的密码学哈希函数。1993年,SHA家族第一个成员SHA-0发布;两年后,SHA-1发布;之后,另外的4种变体:SHA-224、SHA-256、SHA-384以及SHA-512相继发布。这些算法也被称为SHA-2。 2017年,Google表示其已成功破解了SHA-1算法,放出了一个概念验证,两份特制PDF文档拥有相同的SHA-1哈希值,但内容上却不尽相同。正是由于MD5和SHA-1存在的这些安全性问题,这两个哈希函数已从安全性要求高的应用场合消失。 SHA-3算法在2015年8月正式发布。值得注意的是,SHA-3并不是要取代SHA-2,因为SHA-2并没有出现明显的弱点。出于对MD5、SHA-0和SHA-1出现成功攻击的忧虑,NIST感觉需要一个与之前算法不同的、可替换的哈希算法,NSA于2007年正式宣布在全球范围内征集新一代(SHA-3)算法设计。2012年,在进入第三轮评选的五个候选算法Keccak、BLAKE、GrøSTL、JH和SKEIN中,Keccak算法最终获胜并成为官方唯一的标准SHA-3算法。 比特币系统中使用了两个密码学哈希函数,一个是SHA-256,另一个是RIPEMD160。RIPEMD160主要用于生成比特币地址。SHA-256是构造比特币区块链所用的密码学哈希函数,同时比特币地址的生成过程中也用到了SHA-256。无论是区块的头部信息还是交易数据,都使用了这个哈希函数去计算相关数据的哈希值,以保证数据的完整性。同时,在比特币系统中,基于寻找给定前缀的SHA-256哈希值,设计了PoW的共识机制。然而,SHA-256算法被认为容易导致硬件矿机和矿池的出现,引发算力集中,违背去中心化原则。 以太坊使用Ethash算法实现工作量证明机制。以太坊工作量证明基于改进的Dagger-Hashimoto算法,这类算法难以通过设计特殊的ASIC芯片实现。由于以太坊的开发时间恰逢SHA-3标准的发展时间,SHA-3在最终的哈希算法的填充上做了更改,因此以太坊的sha3_256和sha3_512哈希不是标准的SHA-3算法,而是一个变体,通常称为Keccak-256和Keccak-512。 SCRYPT算法被用来设计莱特币(Litecoin)的工作量证明机制。SCRYPT算法最早被用于设计基于口令的密钥生成函数,在设计时就考虑了抵御基于硬件的密钥搜索的攻击模式,这使得算法需占用更多的内存,花费更长的计算时间,并使并行计算变得异常困难。与SHA-256相比,SCRYPT算法具有更强的抵御矿机的能力。基于SCRYPT算法的莱特币的成功,催生了各种各样的算法创新,使得每一个使用创新算法的币种出现都能引起一阵波澜。 考虑到现存的大量可用哈希函数,人们不满足于使用单一的哈希函数。2013年,夸克币(Quark)首先使用了6种公认的安全哈希算法(BLAKE、BMW、GROESTL、JH、KECCAK和SKEIN)进行了9轮的哈希运算设计工作量证明机制。达世币(DASH,前身是暗黑币Darkcoin)则设计X11算法使用了11种哈希算法(BLAKE、BMW、GROESTL、JH、Keccak、SKEIN、LUFFA、CUBEHASH、SHAVITE、SIMD、ECHO)。 Equihash是一种内存依赖型的工作量证明算法,其理论依据是广义生日悖论问题,其算力大小主要取决于拥有多少内存。该算法能够避免少数拥有专用采矿设备的矿工对挖矿过程的中心化的趋势。2016年4月,密码货币Zcash采用了这一算法。Zcash官方认为,该算法在短时间内很难出现矿机,同时由于广义生日悖论是一个已经被广泛研究的问题,很难有人或者机构能够对算法偷偷进行优化。Equihash算法非常容易验证,这有助于在手机等设备上实现Zcash轻客户端。 CryptoNote为比特币以及门罗币采用的应用层协议,采用基于哈希的工作量证明算法CryptoNight。这个算法适用于普通PC的CPU。由于目前并没有可用的专用挖矿设备,CryptoNight只能通过CPU挖矿。